package com.atdel.demo17;


import org.junit.Test;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

/**
 * @BelongsProject: java_study
 * @BelongsPackage: com.atdel.demo17
 * @Author: Del
 * @CreateTime: 2025-03-17  15:33
 * @Description:
 * 通过反射获取类的构造方法，如下所示：
 * public Student(String name,int age,Double weight)
 * 使用反射实例化此类的对象，调用 show 方法，
 * show 方法把构造方法的四个信息打印输出。
 * @Version: 1.0
 */
public class ReflectDemo {

    @Test
    public void test() {
        // 获取系统类加载器
        ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();

        // 获取类
        Class<Student> studentClass = Student.class;

        try {
            // 获取类
            Class<?> aClass = systemClassLoader.loadClass("com.atdel.demo17.Student");
            // 获取构造方法
            Constructor<?> declaredConstructor = aClass.getDeclaredConstructor(String.class, int.class, double.class);

            // 设置访问权限
            declaredConstructor.setAccessible(true);

            // 获取方法
            Method show = studentClass.getDeclaredMethod("show");
            // 设置访问权限
            show.setAccessible(true);

            // 实例化对象并调用方法
            show.invoke(declaredConstructor.newInstance("张三", 18, 180.0));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
